package ioc

import (
	"github.com/gin-gonic/gin"
	"google.golang.org/grpc"
)

// 定义一个接口 --- 对象注册表
type IocContainter struct {
	//采片Map 来保持对象注冊
	store map[string]IocObject
}

// 负责初始化所有的对象
func (c *IocContainter) Init() error {
	for _, obj := range c.store {
		if err := obj.Init1(); err != nil {
			return err
		}
	}

	return nil
}

func (i *IocContainter) Registry(obj IocObject) {
	i.store[obj.Name()] = obj
}

func (i *IocContainter) Get(name string) any {
	return i.store[name]
}

// Gin
type GinApiHandler interface {
	Registry(r gin.IRouter)
}

// 管理者所有的对象(Api Handler)
// 把每个 ApiHandler的路由注册给Root Router
func (c *IocContainter) RouteRegistry(r gin.IRouter) {
	// 找到被托管的APIHandler
	for _, obj := range c.store {
		// 怎么来判断这个对象是一个APIHandler对象
		if api, ok := obj.(GinApiHandler); ok { //断言这个对象有没有实现（Registry(r gin.IRouter)） 这个接口的这个方法，如果实现了这个接口，把它注册进去
			api.Registry(r)
		}
	}
}

// grpc
type GrpcHandler interface {
	Registry(r *grpc.Server)
}

// 所有的对象(Grpc 接口实现) 通过对外通过grpc暴露
func (c *IocContainter) GrpcSerivceRegistry(r *grpc.Server) {
	// 找到被托管的APIHandler
	for _, obj := range c.store {
		if grpcServerImpl, ok := obj.(GrpcHandler); ok {
			grpcServerImpl.Registry(r)
		}
	}
}
